{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Explaining a simple OR function\n",
    "\n",
    "This notebook examines what it looks like to explain an OR function using SHAP values.\n",
    "Through this example, we understand how changing the background distribution affects the explanations you obtain from your [TreeExplainer][tree_doclink].\n",
    "\n",
    "[tree_doclink]: ../../../generated/shap.TreeExplainer.rst#shap.TreeExplainer\n",
    "\n",
    "It is based on a simple example with two features `is_young` and `is_female`, roughly motivated by the Titanic survival dataset where women and children were given priority during the evacuation and so were more likely to survive. In this simulated example, this effect is taken to the extreme, where all children and women survive and no adult men survive."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import xgboost\n",
    "from IPython.display import display\n",
    "\n",
    "import shap\n",
    "\n",
    "rng = np.random.default_rng(42)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create a dataset following an OR function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>is_young</th>\n",
       "      <th>is_female</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   is_young  is_female\n",
       "0         1          0\n",
       "1         1          1\n",
       "2         0          0"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 40_000\n",
    "M = 2\n",
    "\n",
    "# randomly create binary features for `is_young` and `is_female`\n",
    "X = (rng.standard_normal(size=(N, 2)) > 0) * 1\n",
    "X = pd.DataFrame(X, columns=[\"is_young\", \"is_female\"])\n",
    "\n",
    "# force the first sample to be a young boy\n",
    "X.loc[0, :] = [1, 0]\n",
    "display(X.head(3))\n",
    "\n",
    "# you survive (y=1) only if you are young or female\n",
    "y = ((X.loc[:, \"is_young\"] + X.loc[:, \"is_female\"]).to_numpy() > 0) * 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train an XGBoost model to mimic this OR function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9.9998671e-01, 9.9998671e-01, 1.3295135e-05, ..., 9.9998671e-01,\n",
       "       9.9998671e-01, 9.9998671e-01], dtype=float32)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = xgboost.XGBRegressor(n_estimators=100, learning_rate=0.1, random_state=3)\n",
    "model.fit(X, y)\n",
    "model.predict(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Explain the prediction for a young boy\n",
    "\n",
    "### Using the training set for the background distribution\n",
    "\n",
    "Note that in the example explanation below, `is_young = True` has a positive value (meaning it increases the model output, and hence the prediction of survival), while `is_female = False` has a negative value (meaning it decreases the model output). While one could argue that `is_female = False` should have no impact because we already know that the person is young, SHAP values account for the impact a feature has even when we don't necessarily know the other features, which is why `is_female = False` still has a negative impact on the prediction."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explainer.expected_value: 0.7600\n",
      "SHAP values for (is_young = True, is_female = False): [ 0.385 -0.145]\n",
      "model output: 1.0\n"
     ]
    }
   ],
   "source": [
    "explainer = shap.TreeExplainer(model, X, feature_perturbation=\"interventional\")\n",
    "explanation = explainer(X.loc[[0], :])\n",
    "\n",
    "# for the young boy:\n",
    "expected_value = explanation.base_values[0]\n",
    "shap_values = explanation.values[0]\n",
    "\n",
    "print(f\"explainer.expected_value: {expected_value:.4f}\")\n",
    "print(f\"SHAP values for (is_young = True, is_female = False): {shap_values.round(4)}\")\n",
    "print(\"model output:\", (expected_value + shap_values.sum()).round(4))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The same information above, but visualized as a Waterfall plot:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cnJytG3bNv34448Ob6Nbt26aPXu2XnjhBWVmZuqxxx6TJLVt21ZScbeioUOHyt/fXyNGjFB0dLQ2b96sDz/8UOvXr9fmzZvl4+Njt83+/fsrPDxc999/v3bu3KnFixfr+uuv16BBg/TBBx/o1ltvla+vr95++2398Y9/VO/evdWxY8fS18+bN08JCQm64447FBoaquTkZH366afq16+fkpOT1bRp0wqPKTExURMnTlRERITGjh2r0NBQ/fLLL3rttde0ZcsW/fDDDw7/fFA969PKftrtbiySvB0cmpP3vy5BftZz//17ubZzy2vLv6721Fd7Df13v7ufKQBwDjZb5bPFoWaq9Gc0Oztbvr6+5Q60DQgI0NGjR1VYWFjhQNysrCy9//77Du9z1KhRCgoKqkpMHT9+XElJSbrxxhv10UcfVem1v9eiRQtNnTpVCxYsUH5+vqZOnWq3/J577lGjRo2UlJSk0NDQ0va5c+fqj3/8o+bMmaOHHnrI7jUdO3bUxx9/bNf273//WydOnND27dvVuHFjSdINN9yg/v376/nnn9eCBQtK192xY0eZp/r9+9//1m233abZs2frxRdfvODxZGVlacqUKYqLi9PGjRvl7e1duuxvf/ubnnvuOX300Ue65ZZbHPr5nDx5UgEBAaWFT1ZWlgzDKD1f+fn5yszMtPvZHDlyRJGRkRf8Pi0tTeHh4aWFoCvuo4BnE+jyS4pnDXJE/Fs2pZyUcmySTzkv8f3fu1hOLf29GNHGor5RUsLbnKjyZGVnqyjv4v4dZB/sg31cfPto2LChSxyHWftwhMUwDIc/Cnv//fdVVFSk0aNHl1m2YsUK7dy5U3fddVeZT8d/z2azKS0tzeGAERERslorrl0mTpyo+fPna8uWLUpISFBOTo4aNGigmJgYffrpp0pISHB4f+Xp0KGD0tLS7O6ErF69Wv369dMf/vAHPfLII3brFxUVKS4uTn379tV3330nqbj70DfffKP169era9eupeuWFBB333233nrrLbvt+Pv7q1u3blq1alWZTIWFhTp58mTpXZe4uDh17dpVq1evLl0nLCxMERER2rJliyTpzTff1D333KOnn35ad955p932jhw5op49e+quu+7S22+/XY2fEhx1MsdQ6CsVjIh1A+H+0sAWjt0B/GSnoYx8acd4T+08ZWjwx/YX6+MSLHpzoKc6vG1Tcrpj+3/pag9N7uJR7nMK9k/01KpDhqavPref+7t56P5uHuqy0Kaj2eV3Y3IXWfd6KsCbAX8A6ldWVpYCAwPNjuHSqnSnwGq1Kjc3t9xlhYWFpetUto3o6Oiq7LbK/Pz89PDDD+uZZ55Rhw4dFB0drV69eunWW2/VyJEja2UfGzZskFTcnWfevHnlrnPixIkybeePxyi5MxAbG1tm3YCAAJ05Yz+h+ocffqgZM2YoJSVFBQUFdssyMzMrzFxSHEyfPl3Tp08vdx1HuoChZkL8LIoJkg5UfLpc2tGz0oLfqtY1Z9MxQ/2iLWWmcu0VaVF2gaEdp2onW0wDi0a3s2h0u7JDrjbeadWmY4a6LHTvog4A6tuuXbvUuXNns2O4tCoVBQEBATp9+nS5XYQq6lr0e0VFRRcsLMrj6+tbrVl/nnzySd15551677339MMPP2j58uVasmSJ5s6dqxUrVlR5excyatQoDRkypNxlYWFhZdou9CyHC/3cfn8j55tvvtGoUaMUERGhKVOmqFWrVgoICJDFYtHEiRNVVFRxd4eSbU2ZMkU9evQod53mzZtXuA3Ujj5RFh3ewQxEVfHRDkO3tvHQTXGW0ucUhPpJt7ax6PPdht10pLHBxV8dfUjZ7924tOwF/23xFt0W76E7vizUITcu5gAArqtKRUFYWJgOHTqkY8eO2fVTstlsOnHihEN9l7Kzs+t8TEGJli1b6tFHH5UkFRQUaMCAAVqxYoW++eYbDRgwoFrbLNG+fXtJxRfzo0aNqtG2HPXWW2+pqKhIX331ld3g49OnTys7u/L+DPHx8ZKkwMDAesuM8vWIsGjxDiqCqvhoh6GfUw0lDvRQu9AipedIf+rsIU+L9PiP9gXxtyOKi+wW889d4Mc0kO5oV9ztpXt48dfpvYu/7s+Q3tlafD4+3VX2vHRuUrzeV3sNncip5QMDAFSKDy3rXpWKgpYtW2rjxo3asmWLXQGwfft22Ww2tWrVqtJt+Pn5adCgQQ7v08/PryoRJZ17FHaDBg1K27y8vJSQkKAVK1bUSheZK6+8UpdccomWLFmiqVOnlpk/Nz8/X+np6YqKiqrxvkqU3E04fxjIlClTyrSVZ9SoUZo2bZpeffVVTZo0qUy2zMxM5efn2w1cQd3oEWFhqssqKjKkQUsKNbu/h+7t4iE/L2ltmjT2q0KHug61CLboqcvs78iVfP/9QUPvbKVLEAA4q+zs7DITraB2VakoCAkJUfv27fXbb79p2bJliomJ0alTp5ScnKzIyEiHioL6GFOwfv16DR48WJdffrnatWunkJAQbd26VUuWLFFYWJiGDh1a4314eHhowYIFGjJkiHr16qUhQ4aoffv2ys7O1u7du/Xdd9/p73//e5nZh2ritttu0wcffKBBgwZp1KhR8vb21ooVK7R7926H7qY0bNhQr7zyisaNG6f4+HgNGzZMrVu31qlTp7Rjxw59//33WrBggcOzD6H6uoarTN94VO50njRhWZEmLKt4vd/fISix8qBR7sBiRzz5U5Ge/InZiADALMePH6902nXUTJVn9u7Tp4+CgoK0bds2HThwQL6+vkpISFD37t2d5hHUcXFxGjJkiNasWaMffvhBNptNISEhGjZsmJ599lm7Owg1ceWVV+rXX3/Vww8/rO+//16ffPKJfH19FR4ermHDhmn48OG1sp8SQ4cO1dy5czVz5ky99NJL8vb2Vvfu3bVy5UpdfvnlDm1jzJgxatGihR5//HH95z//UUZGhgICAhQZGak777xTffv2rdXMKF+gt0WtGko7T5udBAAAoIpTkgKoPWO/KtS7Ww3Z+A3ERYQpSQGYwTAMp/nw2VVVfVofALWie7iF2YcAAHDAtm3bzI7g8qrcfchVHDhwoNJHZjdq1EiNGjWqp0RwNz0iLYwpAADAAfn5+WZHcHluWxR069ZN6ekVP/50woQJev311+spEdxNpzDJ0yLuFgAAUInaGg+KC3PbouDNN9+sdG7/du3a1VMauCNfq0VtQ6XkimtTAADcXkREhNkRXJ7bFgW1MS0pUFN9oyzaftKQjdkuAQC4oB07dqhz585mx3BpDDQGTNQjwkJBAAAATEdRAJioewTTqwEAUJmYmBizI7g8igLARO1DJW9+CwEAqFBeXp7ZEVwelyOAibw8LerUxOwUAAA4t6NHj5odweVRFAAm6x1pkRe/iQAAwERcigAm6xFhUQGDjQEAuKAOHTqYHcHlURQAJuvBYGMAACq0c+dOsyO4PIoCwGRxIZK/2z4xBACAyuXm5podweVRFAAm87BY1C3c7BQAADivoKAgsyO4PIoCwAn0jmKwMQAAF9K0aVOzI7g8LkMAJ9A9nMHGAABcyPbt282O4PIoCgAnwGBjAABgJooC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",
      "text/plain": [
       "<Figure size 800x250 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# waterfall plot for the young boy (background distribution => training set)\n",
    "shap.plots.waterfall(explanation[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Using only negative examples for the background distribution\n",
    "\n",
    "The point of this second explanation example is to demonstrate how using a different background distribution can change the allocation of credit among the input features. This happens because we are now comparing the importance of a feature as compared to being someone who died (an adult man). The only thing different about the young boy from someone who died is that the boy is young, so all the credit goes to the `is_young = True` feature.\n",
    "\n",
    "This highlights that often explanations are clearer when a well-defined background group is used.\n",
    "In this case, it changes the explanation from \"how this sample is different than typical\", to \"how this sample is different from those who died\" (in other words, why did you live?)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explainer.expected_value: 0.0000\n",
      "SHAP values for (is_young = True, is_female = False): [1. 0.]\n",
      "model output: 1.0\n"
     ]
    }
   ],
   "source": [
    "explainer = shap.TreeExplainer(\n",
    "    model,\n",
    "    X.loc[y == 0, :],  # background distribution => non-survival\n",
    "    feature_perturbation=\"interventional\",\n",
    ")\n",
    "explanation = explainer(X.loc[[0], :])\n",
    "\n",
    "# for the young boy:\n",
    "expected_value = explanation.base_values[0]\n",
    "shap_values = explanation.values[0]\n",
    "\n",
    "print(f\"explainer.expected_value: {expected_value:.4f}\")\n",
    "print(f\"SHAP values for (is_young = True, is_female = False): {shap_values.round(4)}\")\n",
    "print(\"model output:\", (expected_value + shap_values.sum()).round(4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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giNHjuiOO+5Qw4YN5ePjo+DgYMXFxWnChEqufT1Hfn6+6tWrp/j4+HInxkyePFk2m01vvPGGY+zw4cO69dZbFRERIbvdroiICA0cOFB79+49b+ZSDRs2VNu2bZ3GbDab/vznP2vlypVq3769/Pz8FBwcrJtuuklHjhwps473339fCQkJ8vX1VWhoqG655RZt2LBBNptNo0aNqvLPAAAc7N5SRIjzl49d8vMpO26zmZ0WQB0Ud4KJxmarU0+KyM2tekv09fWVl1f1O81NN92kjRs3qn///urYsaNyc3O1detW/fjjj9Xa9uDBg/X666/r66+/Vs+ePZ1ef+ONN9SoUSMNHTpUknTy5El16dJFhw8fVq9evdSlSxelpqbq/fff15o1a7R+/XpFR0dX+7OU2rVrlwYPHqybb75Zt9xyi7777jt9+umnGjFihD799FPHcp9++qluueUWBQYGatSoUQoPD9f777+vIUOG1HjbAKA/JUhfTS9/POlq57Fmf5F+O+qZXAAuDN5eyv9pi4IGdDM7iaXVqVKwZMmSKi978803q3HjxtVa/+nTp7Vhwwb17dtX77zzTnXjOZk0aZJef/11zZs3z6kUfP755zpw4IDGjx/veDrf5MmTdejQIU2aNEmzZ892LDt9+nRNnTpVDz74oJYuXVrjLPv27dPy5ct1yy23OMa6devmyBIbGytJuu+++yRJK1eu1JVXXunI0LFjxxpt98SJEwoKCnLMIcnOzlZwjT8FgAtW6l7p+iecx54bJWWclGa/5zyeccozmQBcOIqLleVVpOLjx53uQnT48GGnP5qe+31GRoYaNmwo23/PQJZ3XGIYhkJCQiSVXOmRlZVlyW1URZ0qBX369KnysjW5dVVAQIB8fHz066+/auPGjTU+GJZKnrx36aWX6tNPPy05GA4uORx+6aWX5OXl5XQ50ieffKKQkBA98cQTTut4+OGH9eyzz2r16tUyDMPxL0N1tWzZ0qkQSNK1116rn376SZs3b1ZsbKwOHz6sbdu2qXv37o5CIEk+Pj667777NG7cuGpvNzw83On70p8BAIs5dUb6Is157GS2dPhk2XEAOJch5XW4RE3OObY796D23O8bNWrk9P35jkt8fX3LHD9aZRtVUaeeUxAbG1vlr5rc4cjX11ePP/64Dhw4oE6dOik2NlaDBw/WG2+8UaOHZowb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+mGbtHySdGv3krEh3aX4CdLj/5/074meywoAAFzq+PHjuuSSS8yOYWnVLgU//vij0tPT1axZM3Xo0EGnTp1Senq6jh8/rr59+5ryV/S5c+dqzpw5CgwMdMv6V61apYCAAH3wwQfy8rooTq5ceP7zo9SwvjS46//GokJLisGyb6S8Asnv4iylAABc7C6UqzAuZtUqBSdOnHAUghtvvNExHhISoh9++EG7du1Sy5YtXR7yfHx9feXr6+u29R8/flxBQUEUAjP9skfqHCeduw+uaCW9+rm0/ZDUvqk52QAAQK1ceumlZkewvGod5e7aVTKp89zr1BMSEmS327Vjxw7XJauG8uYUHDp0SEOHDlXDhg3l4+Oj4OBgtWjRQhMnVv0yk//85z+y2WxKS0vTsWPHZLPZZLPZ1Lt3b8cyGzZs0A033KD69evLbrcrKipKw4YN06lTp5zW1bt3b9lsNh08eFC9e/dWSEiI/P391b17d8dtuKZNm6aYmBj5+PgoJiZGr776aplMjz32mDp37qzw8HDZ7XbVr19f119/fbXmU3z++ef605/+pJCQEPn4+Khx48a69957lZ+fX+V1eNzhk1J0WNnx0rFDJzybBwAAuIy75oWi6qp1puDo0aOy2Wxq0KCB80rsdkVEROjo0aPnXYdhGMrLy6vyNv38/Gp0Summm25Senq6Bg0apA4dOignJ0dbtmzR999/X+V1XHbZZZo9e7aef/55ZWVlaerUqZKkNm3aSCq5rKh///4KDAzUkCFDFBsbq9TUVL399ttav369UlNT5efn57TOHj16qGHDhrrvvvu0Y8cOLV++XDfddJP69Omjt956S7fddpv8/f21ePFi3XPPPeratas6dOjgeH9ycrISExN15513KiIiQunp6Xrvvfd09dVXKz09XTExMZV+ppSUFI0bN06NGjXSqFGjFBERoZ9++knz5s3Tpk2b9M0331T551NjBYXS6bNlx/IKpGPnTDQKDy45O5CTL/mV86+r/3/PEOXU4UIDAAAqVVhYaHYEGNXw9ttvG0uWLCn3tc8//9xITk42CgsLK11HZmamkZycXOWvzMzM8+YaO3asIcnYtGmTYRiGceTIEUOSMXDgwOp8vAolJiYakZGRZcabNm1qNG7c2Dh27JjT+Lx58wxJxsyZMx1jvXr1MiQZgwYNclp26NChhiQjIiLC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LFmiTp06KSAgQA0bNtTdd9+to0ePujYsShjAefz97383JBmDBg0yXn31VWPixImG3W43rr32WqOoqMjt78f51eZn/NBDDxnBwcHGHXfcYbz44ovGvHnzjCFDhhiSjA4dOhhnz5710Ke4uLny9+CBBx4wgoODDUnGvffe66bE1lTb/bR3716jWbNmRmRkpPHQQw8ZixYtMubMmWOMGjXKePPNNz3wCS5+tdlHRUVFxlVXXWV4eXkZd911l5GcnGw8//zzxhVXXGFIMh588EEPfYqLnyQjPDzcuP76642wsDCjadOm1V7HnDlzDElGjx49jOTkZOOxxx4zgoKCjLZt2xrZ2dmuD21xlAJUKj093bDZbMbgwYOdxl988UVDkvHGG2+49f04v9r+jNeuXWucOnWqzPiUKVMMScZLL73k0rxW5Mrfg/Xr1xve3t7Gc889RylwMVfsp6uuusqIjY01Dh065K6YllbbffTDDz8Ykoz77rvPaTwvL89o3ry5ERoa6urIlrVr1y7H/27Xrl21S8HRo0eNwMBA4/LLLzcKCwsd4++//74hyZgxY4arouK/uHwIlXrzzTdlGIbuu+8+p/GxY8cqMDBQy5Ytc+v7cX61/Rl36dJFoaGhZcaHDh0qSUpPT3dZVqty1e9BUVGRxo4dq969e2vw4MFuSGpttd1P33zzjb777js9+OCDio6OVkFBgc6ePevGxNZT232UmZkpSWrcuLHTuK+vryIjIxUUFOTSvFYWFxdXq/e/++67Onv2rP72t7/J29vbMd6vXz/FxcVx/OAGlAJUau3atfLy8tIVV1zhNO7v76+OHTtq7dq1bn0/zs9dP+MDBw5Ikho2bFjrjFbnqn30/PPPa+vWrZo7d647YlpebffTxx9/LElq0qSJ+vXrp4CAAAUFBSk+Pp4DGBep7T664oorVL9+fc2aNUvLly/Xvn37tHXrVj388MNav369nnjiCTemR3WU7stu3bqVea1r167aunWrsrOzPR3rokYpQKUOHTqkyMjIch89HhMTo2PHjik/P99t78f5ueNnXFRUpOnTp8tut+uOO+5wVVTLcsU+2rNnjx5//HFNnTq1xhP2ULna7qdt27ZJKvmr9YkTJ/T666/rtddek6+vr+68806lpKS4LbtV1HYfhYWF6f3331d4eLiGDBmipk2bqk2bNnr55Ze1YsUK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5uYqNTVV06ZNcxpPSUlR//795e/vX+Y9DRo00LBhw7R06VLNmDFDkZGR+vrrr3X//ffrlltu0ZQpUxzLDhkyRLNmzdLq1at13XXXVf8DusHu3btls9nUpk0bx5jdblfr1q21du1aZWdnKzg42MSEAAAAtcPlQxaTmpqqTp061agQjBkzRgEBASoqKtKjjz4qm82mbt26ac+ePUpLS9P1119f4XsnTpyonJwczZ8/X/v379eQIUOUkJCgxYsXOy132WWXKTw8XO+9916185WnuLhYubm5VfoyDKPcdRw/flyhoaHy9fV1Gm/QoIHjdQAAgAsZZwosJD8/X9u2bdNVV11V7kTd0NBQ+fj4VPj+YcOGycfHR8nJyfrXv/6l8PBwNW3aVD/88IMkqXPnzhW+t127drrxxhv18ssv691331VBQYHefffdcv/C3rlzZ33//fc1+IRlZWRk6MMPP6zSsklJSQoJCSkzfvbsWQUGBpYZLx07c+ZM7UICAACYjFJgIZs3b1ZBQYHmz5+v+fPnl3l927Ztio+Pr/D91113nb744gsFBQVpwoQJjgnFjz32mCSpefPmlW7//vvvV+/evXXkyBF9/PHHjrsWnSsuLk5Lly6t6seqVEREhPr06VOlZQMCAsodLywslLe3d5nx0rGioqKaBwQAAKgDKAUWkpaWJklavHixYmJiyrzeqlWrKq2jXbt2TncYOn78uOx2+3mvqy+9+1BcXJx69epV4XJhYWHKycmp8C/01eHn56fY2NharcNut5d74F86Vl5hAAAAuJBQCiwkNTVVdrtdSUlJZa6Pr846Kjugr8iqVas0adIktWrVSjt27NDKlSt14403lrts6bX9NZn3cK6ioqJyn3tQHn9//zK3U5VKLhMq7xKhs2fPSpKCgoJqFxIAAMBklAILSUtLU/PmzWtcCE6dOqX9+/erffv2TuMREREqLCxUVlZWudfk7969W0OHDlWnTp20atUqxcfH6/nnn6+wFJw8eVKBgYEVXs5THb///nut5xRERETo0KFDys/Pd/rZHTlyxPE6AADAhYxSYCFpaWnq2rVrrd4vSR06dHAaT0hIkCTt2bOnzGvZ2dkaMGCAfHx89M477yg0NFR//etfNW3aNG3ZssXpNp+l9uzZU+54TbhiTkFcXJzS0tK0ZcsWx3MKioqKtG3bNjVo0IDbkQIAgAsepcAiMjIydOTIEccBfE2UPvjs3AP/bt26SZLWrVvn9JphGLrzzju1bds2rV692nFt/1//+tdyH2ZWasOGDRo2bFiNc/6RK+YUNGjQQHFxcVqzZo1ycnIUGhqq7du3KysrSz169HBJTgAAADNRCiyi9ID+6NGjWrZsWZnXL7300jKXBZ0rLS1NMTExCg8PdxqPi4tTYmKiVq1apdGjRzvGn3jiCb377rtKTk7Wn/70J8d4VFSUhg8frqVLl2rmzJlOl9+sX79eJ06cqHNPCe7Zs6eCg4O1Y8cO5efnKzw8XL1791Z0dLTZ0QAAAGqNUmARpZf+pKSkKCUlpczrS5YsqVIpOPcsQanRo0dr6tSpysnJUUBAgN555x1Nnz5d48eP17hx48osP3HiRC1atEjz5893eqLx8uXL1aRJkzrzNONSdrtdXbt2rdXlVwAAAHWVzajoMa6wrFGjRunLL7/Uhg0bZLfbVb9+/fO+5/Tp04qLi9OsWbM0ZsyYGm03Ly9PzZo10+TJk/WPf/zD6bXc3FxlZ2dr1qxZmj17to4eParIyMgabQcAAADOyt5/EZC0f/9+RUVF6aqrrqrS8qGhoXrwwQc1e/ZsFRcX12ibKSkp8vHx0fjx48u8Nn/+fEVFRWn27Nk1WjcAAAAqxpkClLF582YdOnRIkhQcHFwnLpnZv3+/tm3b5vi+R48e8vHxMTERAADAxYNSAAAAAFgclw8BAAAAFkcpAAAAACyOUgAAAABYHKUAAAAAsDhKAQAAAGBxlAIAAADA4igFAAAAgMVRCgAAAACLoxQAAAAAFvf/AxX2J2lWMJhmAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 800x250 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# waterfall plot for the young boy (background distribution => non-survival)\n",
    "shap.plots.waterfall(explanation[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Using only positive examples for the background distribution\n",
    "\n",
    "We could also use only positive examples for our background distribution, and since the difference between the expected output of the model (under our background distribution) and the current output for the young boy is zero, the sum of the SHAP values will be also be zero."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explainer.expected_value: 1.0000\n",
      "SHAP values for (is_young = True, is_female = False): [ 0.14 -0.14]\n",
      "model output: 1.0\n"
     ]
    }
   ],
   "source": [
    "explainer = shap.TreeExplainer(\n",
    "    model,\n",
    "    X.loc[y == 1, :],  # background distribution => survival\n",
    "    feature_perturbation=\"interventional\",\n",
    ")\n",
    "explanation = explainer(X.loc[[0], :])\n",
    "\n",
    "# for the young boy:\n",
    "expected_value = explanation.base_values[0]\n",
    "shap_values = explanation.values[0]\n",
    "\n",
    "print(f\"explainer.expected_value: {expected_value:.4f}\")\n",
    "print(f\"SHAP values for (is_young = True, is_female = False): {shap_values.round(4)}\")\n",
    "print(\"model output:\", (expected_value + shap_values.sum()).round(4))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwUAAAEkCAYAAAB+Cp3DAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAABAx0lEQVR4nO3deVxU9f7H8fcAw44oiAu44RYq7ktp5VZmau6p4ZKm5a1bVpp1K9u8VreyzNJK0zKz3bpWlpZZZL9Sc4dMRTN3MMUNQXbO7w8uk+OAAg5zRuf1fDx44HzP93zPZ74eZuYz5/v9HothGIYAAAAAeCwvswMAAAAAYC6SAgAAAMDDkRQAAAAAHo6kAAAAAPBwJAUAAACAhyMpAAAAADwcSQEAAADg4UgKAAAAAA9HUgAAAAB4OJICAAAAwMORFAAAAAAejqQAcKKCggI9/fTTatCggaxWqxo0aKAXXnhBMTExKigoKHN7c+bMUZ06dZSdnV0B0QIAABSyGIZhmB0EcLmYPXu27r33Xj3wwANq0aKFQkNDddttt+nFF1/UbbfdVub2srKyVK9ePT366KO69957KyBiR7m5uUpISNCRI0d09OhRZWdnq0uXLrriiitccnwAAOB6XCkAnGjBggXq0aOHpk+frlGjRunPP/9UXl6e4uLiytWev7+/Ro8erRkzZshV+XtWVpY2bdqkkydPKiwszCXHBAAA5iIpAJwkKytLCQkJ6ty5s61swYIF6tevn/z9/cvd7tChQ7Vv3z7Fx8c7I8wLCgwM1MiRIzV8+HBdddVVLjkmAAAwF0kB4ATjxo1TQECA8vPz9dhjj8lisahmzZpKTEzU9ddf71D/0KFD8vf319ixY+3KV65cKavVqokTJ9rK2rZtq7CwMH3xxRcV/jwkydvbW4GBgS45FgAAcA8kBYATjBgxQv/4xz8kSa+88ooWLVqkO++8U5LUpk0bh/pRUVG6/fbb9d5772nfvn2SpB07dmjIkCHq1auXXnrpJbv6bdq00S+//HLBOAoKCpSVlVWqH6YTAQCAIj5mBwBcDrp3767vv/9eQUFBuueee+Tl5aXHH39ckhQdHV3sPo888ojmz5+v559/XtOmTdNNN92kevXq6cMPP5SXl32+Xr9+fS1atOiCcRw+fFhfffVVqWKOi4tTSEhIqeoCAIDLG0kB4CSJiYlq1qyZ7QP9sWPH5OPjo+Dg4GLrR0VF6Y477tC8efO0adMmZWZmatWqVQoKCnKoW6VKFWVmZurMmTPnHdoTHh6u3r17lyregICAUtUDAACXP5ICwEkSEhLUs2fPMu0zefJkzZ49W4mJifq///s/RUVFFVuvaKiPxWI5b3t+fn6qVatWmWIAAAAgKQCc4OTJkzpw4ICaN29uKwsPD1deXp5Onz5d4jCdZ555RpKUl5d33uU/T5w4ocDAwAt+u5+fn1/qG535+/s7DFMCAACeiaQAcILExERJUosWLWxlMTExkqQ9e/bYlReZPn265s+fr9mzZ+vBBx/UM888o/nz5xfb/p49e9SkSZMLxvHXX38xpwAAAJQZSQHgBAkJCZLsk4KOHTtKkjZs2OCQFHz++ed6+OGHNW3aNN19993atWuXXn/9dU2ZMqXYicmbNm3SiBEjLhgHcwoAAEB5WAzWJQQu2h133KHly5fr4MGDduXNmzdX8+bN9cEHH9jKNm7cqM6dO2vw4MF69913JUnJycmqX7++Ro4c6XC1YOPGjWrXrp1Wrlyp6667ruKfjKStW7cqJydHZ86c0bZt21SvXj1VrVpVkhQbGytfX1+XxAEAAFyDAcWAEyQmJhY7RGjs2LFaunSpMjMzJUkHDx5U37591bp1a82bN89WLzIyUmPHjtW7776rPXv22LWxePFi1alTR927d6/YJ3GWxMREbdiwQdu2bZMk7d27Vxs2bNCGDRtKPWcBAABcOrhSAFSgU6dOqX79+nrhhRc0bty4Mu+fnZ2tevXq6eGHH9Z9991XARECAABwpQCoUKGhoXrooYc0ffp0FRQUlHn/BQsWyGq12u6ODAAAUBG4UgAAAAB4OK4UAAAAAB6OpAAAAADwcCQFAAAAgIcjKQAAAAA8HEkBAAAA4OFICgAXS0tLU9euXZWWlmZ2KAAAAJJICgCXS0tL06pVq0gKAACA2yApAAAAADwcSQEAAADg4UgKAAAAAA9HUgC4WKVKldSxY0dVqlTJ7FAAAAAkSRbDMAyzgwA8zZYtW9SqVSuzwwAAAJBEUgCYIicnR76+vmaHAQAAIInhQ4Ap9u3bZ3YIAAAANiQFgAkyMjLMDgEAAMCGpAAwQWBgoNkhAAAA2DCnADBBbm6urFar2WEAAABI4koBYIrff//d7BAAAABsfMwOAIC9NcmG/rUqX1zCAwCgUIcaFr3Y1UsWi8XsUC5bJAWACWrWrFnith/2G/olWSogKwAAQJL08yFD066RAhl5W2EYPgSYwNvbu8Rt61MKXBgJAAAASQFgioMHD5a4bU0KVwkAAIBrkRQAbiQl3dCRM2ZHAQAAPA1JAWCCmJiYYss3/MUlAgAA4HokBYAJDh06VGz5+hRDPiysAAAAXIykADDB6dOniy3/NcVQPhcLAACAi5EUACbw9/d3KDMMQ+sOi/sTAAAAlyMpAEzQqFEjh7J9adLJbBOCAQAAHo+kADDBb7/95lC24TDXCAAAgDlICgA3sf6wIR/+IgEAgAn4CAKYoHr16g5la1MM5XEzYwAAYAKSAsAEfn5+do8LDEMb/zIpGAAA4PFICgAT7N+/3+7xrhNSRq5JwQAAAI9HUgC4gfVMMgYAACYiKQBM0LhxY7vHGw4bsvLXCAAATMLHEMAEhw8ftnu8JtlQLpOMAQCASUgKABOkpaXZ/p1XYCjhqInBAAAAj0dSAJjA19fX9u9tx6TsfBODAQAAHo+kADBBkyZNbP9mkjEAADAbSQFggoSEBNu/uZMxAAAwGx9FAJOtSeZOxgAAwFwkBYAJIiIiJEnZeYa2pZocDAAA8HgkBYAJgoKCJEkJR6U8phQAAACTkRQAJti7d6+kwpuWWcwNBQAAgKQAMNP6w4a8yQoAAIDJSAoAEzRs2FCStDrZYPgQAAAwnY/ZAQCeKDU1VfIN0h8nzI4EAACApAAwxcmTJ3XAp65YiRQAALgDhg8BJvDx8dGGw4a8mE8AAADcAEkBYILY2FitY+UhAADgJhg+BJggISFBa5KbKZ9JxoDLhPpJL3T20sBGFgVapXUphh74sUCbj1x43/Y1pDGxXrqyhkUtIiSrt0WWF/MuuN/VUdLPcYVvtVVfy9OxzIt9FgBQMbhSAJjgVI5F+9LMjgLwHBZJXw/y1vAmFs3eXKCHVhWoWqBFPw7zVsPKF96/d30v3d7cIkPSn6dKf8xZ3b2VnkP2D8D9XRZJwfjx42WxWLR169YKaT8/P1/jx49XtWrV5O3tLYvl0hj0ERERoebNm5sdBopxUNXNDgHwKDdfYdHVURaN+aZA/15j6PUthrp+nK98Q5p69YXfCt/YUqDQWflq/16+vttXug/541taVDtEmv8bSQEA91fm4UOGYei3337T9u3blZ6eLn9/f9WvX1/t2rWT1WqtiBhN9/zzz2vevHnq3bu3OnfuLG9vb7NDwiUu6UyIvC1i+BDgIjc3tuhwhqH/7vz7jy41U/okydDIphb5eks5+SXvf+RM2Y5XxV96+movPbG68IoEALi7MicFa9as0datW1WvXj21aNFCJ0+e1NatW3Xs2DH16dPHlG/RZ8+erRkzZigwMLBC2l+5cqUCAgK0dOlSeXldFhdXYLL/25spQ75mhwF4jNbVLNr0l6Fz8/B1KYb+0dJLjatIW1Odd7xpV3vp8BlpboKhxzuSFABwf2VKCo4fP25LCG644QZbeUhIiFavXq3du3fb7tTqSr6+vvL1rbgPWMeOHVNQUBAJAZwm8VSgCrhKALhMzSDpp4OO5SkZhb8jgy3amuqcP8rmVaV/tLSo92cF/J0DuGSU6VPu7t27JclhnHpMTIx8fHy0a9cu50VWBsXNKUhOTtawYcNUvXp1Wa1WBQcHq0GDBpo4cWKp2/30009lsViUmJio1NRUWSwWWSwW3XjjjbY6mzZtUo8ePVS5cmX5+PgoIiJCI0aM0MmTJ+3auvHGG2WxWHTo0CHdeOONCgkJkb+/vzp16qQ///xTkjR16lRFRUXJarUqKipKb775pkNMjz/+uNq0aaOwsDD5+PiocuXKuv7668s0n+K7777T1VdfrZCQEFmtVkVGRuruu+9WTk5OqdtA+f2VYehYzuU51A5wBYskP+/S/RQJ8JGyixkelJX393ZnefU6by3fY5R67gEAuIMyvQwePXpUFotF1apVs2/Ex0fh4eE6evToBdswDEPZ2dmlPqafn1+5hiT16tVLW7du1cCBA9WiRQtlZmZq+/bt+uWXX0rdRtu2bTV9+nS9/PLLOn36tJ544glJUpMmTSQVDivq16+fAgMDNXToUNWqVUsJCQn65JNPtHHjRiUkJMjPz8+uzS5duqh69eq6//77tWvXLi1evFi9evVS79699dFHH2nIkCHy9/fXO++8o7vuuktXXXWVWrRoYdt/7ty5io2N1ahRoxQeHq6tW7fqiy++0LXXXqutW7cqKirqvM9pwYIFGj9+vGrUqKExY8YoPDxca9eu1RtvvKHffvtNP/30U6n7B+Wz8S8+KAAXo3PtwlWDSiPm7TwlHZcy8+yThCL+/3sXzLzw6qKlMvQKizpFSrHvcL9yAJeWMiUFGRkZ8vf3L3aibVBQkP766y/l5+efdyJuenq6Pvzww1IfMy4uTiEhIWUJU0ePHlViYqIGDBigTz/9tEz7ni06OlqTJ0/WwoULlZOTo8mTJ9ttv/3221WlShUlJiYqPDzcVj5nzhzdddddmjFjhh555BG7fVq0aKH//ve/dmUff/yxjh07ph07dqhq1aqSpJtuukldunTRSy+9pIULF9rq7ty5U5UrV3bY/5ZbbtH06dM1c+bMEp9Penq6Jk6cqMaNG2vz5s12Q64efPBBvfjii/r000918803l6p/jh8/rqCgIFvik56eLsMwbP9fOTk5On36tF3fpKSkqGbNmiU+Pnz4sKpXr25LBC/HY1T2Y3wxcDF2HDM0Zvl5ZgWfJSX9f78zCocQnauoLDndOcn69C5eWpxkKCdfqlupsKzy/74bqh0i+Xr9PWQJQNmkHD6sBrXd5/38UjpGaZQpKcjLyytxXH1RIpCXl3fepCAgIEC9e/cu9TEDAgLKEqIkKTg4WD4+PkpMTNTWrVsVGxtb5jYu5Oeff9a+ffv0j3/8Q5mZmTp48O/Bqr1795afn5++++47h6Tgscces3vctWtXffzxx+rXr58tIZCkzp07KyAgwDa0qEhRQpCfn6/jx48rOztbV199tQICArRhw4bzxvzxxx/r1KlTeuihh3TkiP3deoYOHaoXX3xRX331VamTgrCwMLvHwcHBdo99fX3tTlhJDifouY9r1Khx2R+jVTXJS4YKuJ8xUC5/nZEW/l62D/Fbjhi6tpZFFslusvGVNS3KyDW084RzYqtTyaIRTS0a0dTxvXLzrT7acsRQ63dLl9AAsFfznPdWs9/PL6VjlEaZkgIfHx9lZWUVuy0/P99W50Jt1KpVqyyHLbOAgAA9+uijevbZZ9W8eXPVqlVLV155pYYMGaJhw4Y55RibNm2SVDicZ+7cucXWOXbsmEPZufMxihKB+vXrO9QNCgrSqVP2d8n55JNPNG3aNCUlJSk3N9du2+nTp88b82+//SZJmjJliqZMmVJsndIMAcPFCbRaFBNu0TbH0wNABfl0p6EhV3hpUGOLPvvfsqThAdKQKyxautuwW460fmjh79LepOxsAz53/MB/S4xFt8R4adSyfB08/8s0AJimTElBUFCQTp48WewQofMNLTpbQUFBiYlFcfz9/cu16s/UqVN166236oMPPtBPP/2klStX6rPPPtOcOXMUHx9f5vZKEhcXp759+xa7LSIiwqGspHs5lNRvhvH3d1rffvut4uLiVKNGDU2cOFENGzZUUFCQLBaLxo8fr4KC849hLWpr4sSJat++fbF16tWrd9424BxX+J/UTq/KymPYMeASn+40tCbZ0IIbvdQ0vECpmdI/W3nJ2yI9+Yv9H+L3Qwtfj6Pn/f0Bv04laVTTwqt77aoX/p5yVeHvfWnSe9sKX1+/+MPxCkaraoX1lu8xdCzTyU8MAJykTElBRESEDh48qCNHjthdlsjLy9OxY8dKdakiIyOjwucUFGnQoIEef/xxSVJubq569uyp+Ph4ffvtt+rZs2e52izSrFkzSYUf5uPi4i6qrdJ6++23VVBQoOXLl9tNPj558qQyMi48SDUmJkZS4WUoV8WM4jUNydDnhyqbHQbgMQoMqfdn+ZrexUv3tvZSgFVaf1gaszy/VEOHokMtevoa+y9vih7/eMDQe9sYEgTg0lampKBBgwbavHmzfvvtN7sEYMeOHcrLyyvVPQpcMacgLS1NklSpUiVbmdVqVWxsrOLj450yRKZbt26qXbu2PvvsM02ePFktW7a0256Tk6PU1FRFRkZe9LGKFF1NOPvqgVT4zf+5ZcWJi4vTww8/rNdff1133nmnQ2ynT59WTk6Owzg1OF/HWlYZO8yOAvAsJ7OlO1YU6I4V56939hWCIqsOGLK8WL4liqauLtDU1VwWBODeypQUhIWFqVmzZvr999+1YsUK1alTRydOnNDWrVtVs2bNUiUFrphTsHHjRvXp00edO3dW06ZNFRYWpm3btumzzz5TRESE+vXrd9HH8PLy0sKFC9W3b19deeWV6tu3r5o1a6aMjAzt3r1bP/zwg/71r385TDS+GLfccos++ugj9e7dW3FxcfL19VV8fLx2795dqqsplStX1muvvaaxY8cqJiZG/fv3V6NGjXTixAnt3LlTP/74oxYuXFjqicYov47RleTjJYYPAQAAt1Dm27V07NhRISEh2r59u/bv3y9/f3/FxsaqXbt25bqfQEVo3Lix+vbtq3Xr1umnn35SXl6ewsLC1L9/f/3nP/+xu4JwMbp166Zff/1Vjz76qH788UctWbJE/v7+ql69uvr376+BAwc65ThF+vXrpzlz5uj555/XrFmz5Ovrq3bt2mnVqlXq3LlzqdoYOXKkoqOj9eSTT+rrr79WWlqagoKCVLNmTd16663q1KmTU2NG8fbv+UMtqsZq05EL1wUAAKhoFqM0404AONWWLVs0P7W53kw0lMvVAgAALijjPm8FWt3jC+jLUdmX9QFw0erVq6d2NSwkBAAAwC2UefjQ5WL//v3Kyzv/pLEqVaqoSpUqLooIniQ9PV3ta4SaHQYAAIAkD04K2rZtq9TU1PPWueOOO/Tmm2+6KCJ4ktTUVDVvESV/HymrfAuaAAAAOI3HJgVvvfXWBdf2b9q0qYuigSfy9rKodTVpTbLZkQAAAE/HRGPARA/E52vWZiYbAwBwIUw0rlhMNAZM8Pvvv0sSk40BAIBbICkATJCbmytJal+DbzwAAID5SAoAE4SGFq481KCyFGI1NxYAAACSAsAE1atXlyRZLBa1q2FyMAAAwOORFAAm2Llzp+3fV0Va5MNfIgAAMBEfRQCTta9hUR6TjQEAgIlICgAT1KlTx/bvdtWZbAwAAMxFUgCYICsry/bvWiFSuL+JwQAAAI9HUgCY4MiRI7Z/WywWXVlT4noBAAAwC0kB4AY61PSSF1kBAAAwCUkBYILmzZvbPW5fQ8o3TAoGAAB4PJICwARnL0kqMdkYAACYi6QAMEF2drbd42pBFtUMMikYAADg8UgKABOEhIQ4lHWMFPMKAACAKUgKABNERUU5lHWo4cUKRAAAwBQkBYAJduzY4VDWjsnGAADAJCQFgJtoy2RjAABgEpICwAS1atVyKKvsb1G9SiYEAwAAPB5JAWCCvLy8Yss7RVrkzQUDAADgYiQFgAkOHz5cbHn7mhYxrQAAALgaSQHgRtpVt6iArAAAALgYSQFggtjY2GLLW1fjjxIAALgenz8AE+zevbvY8iBfixqHuTgYAADg8UgKABNkZmaWuO2qmhb5MNkYAAC4kI/ZAQCeKCgoqMRtHWpa9M7vBnc3BgDgf3y8JC/eGCsUSQFggjp16pS4rW8DiwyDi3gAABRpWc0ify6jVyiLYRisdQK42JYtW9SqVSuzwwAAAJDEnAIAAADA45EUACaIjIw0OwQAAAAbkgIAAADAw5EUACZITk42OwQAAAAbkgIAAADAw7H6EGCC7Oxs+fn5mR0GAACAJK4UAKbYv3+/2SEAAADYkBQAJjh+/LjZIQAAANiQFAAmYNQeAABwJ8wpAEyQlZUlf39/s8MAAACQxJUCwBTr1q0zOwQAAAAbkgIAAADAw5EUACaoXr262SEAAADYkBQAJrBarWaHAAAAYENSAJjg4MGDZocAAABgQ1IAAAAAeDiWJAVcLTdPmU9/rIAc/vQAAJAkWb2lqbdIFovZkXgskgLA1Ravloa+WPgCCACApzMk5eVLe+dIdauZHY3H8jE7AMDj5BcU/s7NNzcOAADcyfo/SApMxJwCAAAAmMvqLW3YbXYUHo2kAAAAAObKzZfW7jQ7Co9GUgAAAADzbfhDKigwOwqPRVIAAAAA82VkS38cNjsKj0VSAAAAAPewfpfZEXgskgIAAACYz+pduAIRTEFSAAAAAPMx2dhUJAUAAABwD1v2FN7IDC5HUgAAAAD3kJ0nbTtgdhQeiaQAAAAA7oObmJmCpAAAAADuwYfJxmYhKQAAAIB7yMuXVu8wOwqPRFIAAAAA97HtgJSda3YUHoekAAAAAO4jr0BK3Gt2FB6HpAAAAADuw2JhXoEJSAoAAADgPrwt0npWIHI1kgIAAAC4j7wCaQ2TjV2NpAAAAADuZVeKlJFldhQehaQAAAAA7qXAkDbvMTsKj0JSAAAAAPfixWRjVyMpAAAAgHuxWKR1u8yOwqOQFAAAAMC95BdIa5PMjsKjkBQAAADA/ew9Kp3MMDsKj0FSAAAAAPe0gXkFrkJSAAAAAPfj7cVkYxciKQAAAID7MQySAhciKQAAAID7KTCkNUw2dhWSAgAAALinwyelv06aHYVHICkAAACA+2KysUuQFAAAAMA9+TDZ2FVICgAAniE0UJp7p3RkgZT+gfTDVKl1/dLt276h9Np4acN0KecTyfhv6fa7OqawrvFfKTyk/LEDnirfkH7lzsaucFknBffcc48sFot+/fVXs0MBAJjJYpG+fkwafq00e7n00LtStVDpx39LDWteeP/ebaXbrytcDeXPv0p/zFm3S+mZFxc74MkMQ1q3q/A3KpSPsxravHmzUlNTlZqaqtOnTys4OFjDhw93VvMAAJQs/t/S3iPSbbOL335zx8Jv7W+eLn22prDsk9XSztnS1GHSiJnnb/+Nb6Tnl0hZOYUf9K+IunBM43tItatK87+X7r+pTE8HwFmOp0sHUqU6EWZHcllz2pWC9evXKzk5WZUqVZKfn5+zmr0oM2bM0OnTp9W+fXuzQwEAmOnmjtLhE9J/1/5dlppWmBj07yD5XuA7siOnChOC0qoSLD09XHriI+lkRvliBvA35hVUOKclBbfccotGjx6tPn36KDAw0FnNXhRfX18FBwfLy+uyHiUFALiQ1tHSpj8dhyCs2yUF+UuNI517vGlxhUspzl3h3HYBT+TjLW3YbXYUlz2nfVquVKmSs5pymuLmFBw5ckTDhw9X9erVZbVaFRwcrPr16+uee+4pdbs5OTmqVKmSGjduLKOYMW4PP/ywLBaL3n//fVtZSkqKbr75ZoWHh8vHx0fh4eEaMGCA9u7de8GYi1SvXl1Nmza1K7NYLLruuuu0YsUKNW/eXH5+fgoODlavXr105MgRhza+/PJLxcTEyNfXV6GhoRo8eLA2bdoki8WiMWPGlLoPAOCSUrOKlHLCsbyoLDLMecdqXlf6xw3SpAVSQYHz2gU8VV6+tJabmFU0p80pcIasrKxS1/X19S3XFYBevXppy5Yt6tevn1q1aqWsrCzt2LFDa9asKdOxBw0apIULF2rVqlXq2rWr3fb3339fNWrU0LBhwyRJJ06cULt27ZSSkqKePXuqXbt2SkhI0Jdffql169Zp48aNqlmzFBPdSrB7924NGjRIN910kwYPHqyff/5Z33zzjW699VZ98803tnrffPONBg8erMDAQI0ZM0ZhYWH68ssvNXTo0HIfGwBczse7cCWhs1l9JD+r4wo/x9MLrw4E+ErZeY5tFQ0JCvB1XnyvjpOWb5K+S3Bem4Cn27C7MMlm9EeFcauk4N133y113ZtuukmRkWW73Hvq1Clt2rRJffr00ZIlS8oanp3Jkydr4cKFeuONN+ySgu+++04HDx7UnXfeKR+fwu59+OGHlZycrMmTJ2v69Om2utOmTdMTTzyhhx56SIsWLSp3LPv379fixYs1ePBgW1nHjh1tsdSqVUuSdP/990uSVqxYoSuvvNIWQ6tWrcp13OPHjysoKMg2hyQ9PV2GYSgkpPBNOScnR6dPn1Z4eLhtn5SUFLsE6NzHhw8fVvXq1WWxWC7rYwC4CFfHSD9OK7487lr7snr/kPYdlTJzJL9i3vL8/5cMZJZhvsD5DL1a6nSFFHu/c9oDUCivQCnJKapZ6+9J/u7wfn6pHKM03Cop6N27d6nrnt0RpRUQECCr1arff/9dW7ZsKfeHYUmKjY1Vy5Yt9c033yg9PV3BwcGSpFmzZsnLy8tuONLy5csVEhKip556yq6NRx55RC+++KLi4+NlGIbtZCirhg0b2iUEktStWzetXbtW27ZtU61atZSSkqKkpCR16tTJlhBIktVq1f3336/x48eX+bhhYfaX24v6oIivr6/D/9O5J+i5j2vUqOERxwBwERL2Stc/ZV/20pjCicTTv7AvP3yy8HfKicIhROcqKks+7pzYpt8qLV4j5eRJdf+3UkrloMLftasWTmgubhgTgPNrHW2XEEju8X5+qRyjNNwqKSj6Rrui+Pr66sknn9RTTz2l1q1bKyoqSh06dNDgwYM1fPjwMn8oHz9+vO6++2699dZbuu+++5SWlqYVK1aoXbt2atasma3e4cOHFR0draCgILv9fXx8VKdOHSUlJSkrK0sBAQHlel5RUY5L40VEFL4ZFc0rSEoqHIvXoEEDh7qtW7cu13EBwBQnM6TvE+3LTqQXftg+t7zIlr3StU0K7x1w9lywKxtJGVnSzmTnxFYnQhoRIY3o7Lht80vSlj1S6weccyzAU1i9pY6NzY7isudWA7POnDlT6p/8/PxyHWPKlCnauXOnnn76aTVt2lTx8fEaOXKkOnfuXOY2x40bp5CQENuwp7lz5yo7O1ujR48uV2ySzjtPoqT4zrdPAZPcAED6dI1Uo4o06Kq/y8JDpCGdpKUbCr/ZL1K/euFPeQx4zvHno58Lt416RZq4oPzPAfBUuflS+0ZmR3HZc6srBe+9916p65ZnTkGR6OhoTZkyRVOmTFFeXp769OmjFStWaOnSpRowYECp2/Hz89OAAQP0/vvvKzExUQsWLFCVKlUcVvGpWbOmUlJSlJGRYXe1IC8vT/v371e1atXk7+8v6e9hUeeuHJSVlaXjx4+rWrVq5XrOjRsXZti7dzsu6bV58+ZytQkAl4xP10hrkqQF90hNa0mpp6V/3ih5e0lPfmRf9/uphb+j7/y7rE6ENKpL4b/bNSz8PeXmwt/7jkrvrSr89xfrHI/dKrrw9/JN0rHTznk+gKdp5zjSAc7lVklBRc8pSE9PV25urqpU+XtcqY+Pj1q0aKEVK1YUu4TnhTzwwANatGiRJk2apO3bt2vEiBEO92m48cYb9eabb+rf//63nn/+eVv5888/r7S0NPXr1882dCk2NlaStGzZMvXt29dW97HHHit2+dPSioyMVOPGjbVu3Tr9+uuvtnkFubm5mjlzZrnbBYBLQkGB1Ptpafpo6d4+hasNrf9DGjOrdEOHoqsV3ozsbEWPf9z6d1IAwPlCAqQGNS5cDxfFaUnBzp07lZ6eLqnwW+38/Hxt2rRJUuEEiaJvqs+noucUbNu2TV27dtU111yj2NhYhYWFaceOHVq8eLEiIiI0cODAMrfZsmVLxcbG6vvvv5fFYtHdd9/tUOe5557TV199penTp2vr1q1q06aNEhMTtXTpUtWsWVMvvPCCre6AAQNUq1YtzZ8/X6dOnVKjRo20Zs0aJSQk2Gadl9eMGTPUv39/3XDDDRo2bJhtSdKcnMJVN8o70RkATNftiQvXOZkh3fF64c/5nH2FoMiq3yXLoPLFNvXjwh8A5dO+YeF8IFQopyUFSUlJSklJsSvbsGGDpMLhM6VJCipavXr11L9/f61du1Y///yz8vLyFBYWpr59++qZZ56xTc4tq/Hjx+vee+9V06ZNddVVVzlsr1KlitavX697771X8fHx+vbbb1WpUiX17dtXr7zyit0McW9vb3311Ve6/fbb9dlnn8nb21tt27bVDz/8oO7du5f7uUtSnz59tHjxYj3yyCNasGCBAgMDdf311+vuu+/WddddZxvCBAAA4BZ8vAsXBECFsxgXMyYFkqR58+Zp/PjxevbZZ/XII4+YHU6Zvf322xo3bpz+85//6OGHHzY7nMvfRz9LcTPMjgIAgEvDfx+SBjp+6QrncqvVhy5Vs2fPVnBwsO68s5hLzm7EMAzbEK8iOTk5eumll+Tl5aWbbrrJpMgAAABK0L6h2RF4BLeaaOwODhw4oNzc3PPWqVy5sjIzM/XJJ5/ol19+UWJiosaPH283gdkdZWdnq1atWurZs6diYmJ0/PhxffXVV9q7d6+GDRtmm+QMAADgFsKDpaiyLy6DsiMpOEe7du0uuArR6NGjNXToUE2aNEmBgYG66aabNGOG+w8HsVqtuuaaa7Rq1Sp9/vnnMgxDkZGR+te//qVnn33W7PAAAAD+ZrFIVzZmkrGLkBSc46233tLp0+dfRzomJkatW7e+qCVCzVA0iRkAAMDtef0vKYBLkBScg3H1AAAAbiC/gJuWuRATjQEAAOCemGTsMiQFAAAAcD+RVaSIULOj8BgkBQAAAHAvXhbpKuYTuBJJAQAAANyLxSJ14E7GrkRSAAAAAPeSXyC1JylwJZICAAAAuJ829c2OwKOQFAAAAMC9RFeTKgeZHYVHISkAAACA+/D2kjrFmB2FxyEpAAAAgPswDG5aZgKSAgAAALiPAoOblpmApAAAAADuw8sitWaSsauRFAAAAMB9XBElBfqZHYXHISkAAACAe/Dx5k7GJiEpAAAAgHvIz+dOxiYhKQAAAIB7MMQkY5OQFAAAAMA9+HhLzeuYHYVHIikAAACAe4itI/lazY7CI5EUAAAAwHxWb6nTFWZH4bFICgAAAGC+3HzuZGwikgIAAAC4ByYZm4akAAAAAObzt0pNapkdhcciKQAAAID5WkVL3t5mR+GxSAoAAABgLqu31JFJxmYiKQAAAIC5cvOZT2AyH7MDADyWNzk5AAAyDKnAYOUhk5EUAK7Wt50ODWypqKDKZkcCAIB7sHpLDWuaHYVHsxiGYZgdBOBpfvrpJ3Xu3NnsMAAAACSRFACmSEtLU6VKlcwOAwAAQBITjQFTJCUlmR0CAACADUkBYILMzEyzQwAAALAhKQBMYLVazQ4BAADAhjkFgAmysrLk7+9vdhgAAACSuFIAmGLdunVmhwAAAGDDfQpQLvn5+dq5c6fZYVyy9u3bp+3bt5sdBgAA8ACNGzeWt7f3eeuQFKBcdu7cqaZNm5odBgAAAC5g27ZtatKkyXnrMKcA5cKVgvLbvXu3+vbtq6VLl6pBA27pfjHS09PVoUMHrVu3TsHBwWaHc8miH52HvnQO+tF56EvnuNT7sTRXCkgKABfbvn27mjZtWqqsHeeXlpam0NBQnTp1ipvBXQT60XnoS+egH52HvnQOT+hHJhoDAAAAHo6kAAAAAPBwJAWAi1WtWlV169ZV1apVzQ7lkufn56cnn3xSfn5+ZodySaMfnYe+dA760XnoS+fwhH5kTgEAAADg4bhSAAAAAHg4kgIAAADAw5EUAAAAAB6OpAAAAADwcCQFQAn+85//aMiQIapfv74sFovq1atXrnbeffddtW7dWgEBAapevbpuv/12HT16tNi6v/76q66//nqFhISoUqVKuvHGG7Vly5Zi6yYnJ+vWW29VRESEAgIC1K5dOy1evLhcMVYkV/ZjVlaW5s2bp/79+6tevXoKCAhQ/fr1FRcXp+3btzu0uXfvXlkslmJ/YmNjyxVnRXL1OTlmzJgS++fTTz91qJ+dna0nnnhC0dHR8vPzU4MGDfT0008rNze3XHFWFFf24/nOsaKf999/v1T1L9dzcu7cuRoxYoRiYmLk7e0ti8Vy3vpJSUkaMGCAqlSpoqCgIF177bX64Ycfiq176tQpTZgwQVFRUfL391ezZs30xhtvyN3WWHFlPxqGoffee0+33HKLGjZsqMDAQNWpU0f9+vXTr7/+Wuw+JZ2T7nhnX1efk0899VSJ/fPiiy861C8oKNDLL7+smJgY+fv7q3bt2nrggQeUkZFR5jidjdWHgBJYLBaFhYWpTZs22rhxoypVqqS9e/eWqY2XX35ZkyZNUpcuXTR8+HAdPHhQM2bMUN26dbVu3ToFBQXZ6q5du1Zdu3ZVVFSU7rnnHknS7NmzdeTIEa1evVrNmze31T1+/LjatWunI0eOaNKkSapVq5Y++OADrVq1Sm+//bZuu+02p/SBM7iyH3fs2KEmTZrommuu0Q033KDIyEj9+eefeuONN5SRkaFvvvlG3bp1s7W7d+9eRUdHa+DAgRo0aJDdMStXrqybbrrpop+/M7n6nBwzZowWLlyoRYsWObTTuXNn1alTx65swIAB+uKLLzR27Fh17NhRa9as0dtvv63Ro0frnXfeKc9TrhCu7MeMjAwtWbKk2DbuueceZWZm6tChQ7Ylij3xnKxXr56OHTum1q1ba8+ePTp48GCJH9p3796tDh06yMfHR/fff79CQ0M1b948bd26VcuXL9f1119vq5uTk6NrrrlGmzdv1oQJE9SkSRMtX75cS5Ys0ZNPPqmnnnrqIp65c7myH7OyshQQEKBWrVqpT58+io6OVkpKiubMmaPk5GS9++67GjlypEN81157rcaPH29XbrVaNWzYsDI/34rk6nPyqaee0tSpU/Xyyy87LDXetm1bNWnSxK7svvvu06uvvqqBAweqV69e2r59u2bNmqVrr71WK1eulJeXid/XGwCKtXv3btu/mzVrZtStW7dM+x89etQIDAw02rdvb+Tl5dnKv/zyS0OS8cwzz9jVb9++vRESEmIcPHjQVnbw4EEjJCTE6NGjh13dBx980JBkfPnll7ayvLw8o3379kZYWJhx+vTpMsVakVzZj6mpqcbmzZsd2vj9998NX19fo23btnble/bsMSQZTz75ZJliMourz8nRo0cbpX2b+Prrrw1JxqRJk+zKJ02aZEgyfvnllzLFWpFc3Y/FWb16tSHJuPnmm+3KPe2cNIzC55yfn28YhmH06dPnvOfckCFDDC8vL7u/89OnTxt16tQxGjdubBQUFNjKX3vtNUOS8eqrr9q1MWjQIMNqtRp79+4tc6wVxZX9mJuba/z4448O5YcPHzbCw8ONatWq2dopIskYPXp0mWMyg6vPySeffNKQZOzZs+eC7W7dutWwWCzGoEGD7MpfffVVQ5Lx/vvvlzlWZ2L4EFCC+vXrX9T+n3/+uc6cOaMJEybI29vbVt63b1/Vr19f7733nq3sjz/+0Pr16zVkyBBFRUXZyqOiojRkyBCtXLlShw8ftpV/8MEHatCggfr27Wsr8/b21oQJE3T8+HEtW7bsomJ3Jlf2Y3h4uFq1auXQRtOmTRUbG6utW7eWeJysrCydOXPmomKtaK7sy7MZhqG0tDQVFBSU2PYHH3wgSbr//vvtyosel9S2Gczqx7PNnz9fknT77beXWMcTzkmp8FvZ0nw7mpGRoS+//FJdu3a1+zsPDg7W7bffrp07d2r9+vW28g8++ECBgYG644477Nq5//77lZubq48//viiY3cWV/ajj4+PunTp4lBevXp1denSRUeOHNGRI0eK3TcnJ0fp6ekXHWtFcmVfnistLU15eXklbv/www9lGIbD6+Qdd9yhwMBA018nSQqAClL05tSxY0eHbVdddZV27Nhhe3G9UF3DMLRx40ZJUkpKig4dOqSrrrqq2Lpnt3c5KEs/lqSgoEApKSmqXr16sdtfeuklBQYGKigoSLVr19YTTzyh7Ozsiw/ezZS3L0NDQxUaGqqAgAD16NGj2HHH69evV1RUlGrXrm1XXrt2bUVGRnJOniU9PV2ffPKJ6tatqx49ehRbx1POybJITExUdnZ2if0u/f1/U1BQoE2bNql169by9/e3q9uhQwdZLJbL6px0loMHD8rX11eVK1d22Pbpp58qMDBQISEhqlatmiZMmKBTp065Pkg31aJFC4WGhsrf31+dOnXS8uXLHeqsX79eXl5e6tChg125v7+/WrVqZfo56WPq0YHLWHJysiTZffNfJCoqSoZhKDk5WY0bN75gXUk6dOhQqdo9u+7loCz9WJI5c+YoJSVFjz/+uF25l5eXunfvrgEDBqhu3bo6evSoPvnkE02bNk1r1qzRN998Y/dN8KWurH1Zo0YNTZw4UW3btlVQUJASEhI0c+ZMXXvttVq2bJnd+O3k5GQ1bdq02ONGRUXp4MGDFfCMzHGx5+THH3+s9PR0TZ482eHbSE87J8uiLK99J06cUGZmZrF1/fz8VLVq1cvqddIZli1bpnXr1mnUqFHFJlJDhgxRw4YNlZaWpmXLlmn27NlatWqVVq9e7ZYTjl2lcuXKGj9+vDp16qQqVaooKSlJM2fOVJ8+ffT2229rzJgxtrrJycmqWrWq/Pz8HNqJiorS6tWrlZOTI19fXxc+g7+RFAAVpOiyf3F//EUvuEV1Kqru5eBin+/q1as1adIktWzZUo8++qjdtjp16uj777+3Kxs3bpzGjx+vefPm6aOPPtKIESMu9im4jbL25XPPPWdXZ8CAARo+fLhatWqlu+66S7t27bJru7h2i9rmnPzb/Pnz5eXlVeyCAJ52TpaFs14ni+pfTufkxdq1a5dGjRqlqKgovfTSSw7bz706eOutt6pFixaaMmWKXnnlFU2ZMsVVobqdc4cCSdLYsWMVGxuriRMn6uabb7YlTRd6nSyqY1ZSwPAhoIIEBgZKUrGX/LOysuzqVFTdy8HFPN+NGzeqT58+ioyM1Ndff+3w7VdJit7gvv766/KE7Lacce40atRIQ4cO1R9//KGdO3fatV3S8JasrCzOyf/Ztm2b1q5dqx49ejis3nQ+l+s5WRbOep0sqn85nZMXY8+ePbruuutksVi0fPlyRURElGq/Bx98UL6+vh59TpYkPDxcd955p06ePKnVq1fbyi/0OllUxywkBUAFiYyMlFT8UJ5Dhw7JYrHY6lyorvT35fGy1L0clKUfz7Zp0yb16NFDoaGhio+PL1Of1K5dW97e3kpNTS1/4G6ovH15rqJ1v8/un8jIyBKHYxw6dIhz8n/eeustSeefYFycy/WcLIuyvPZVqVJFAQEBxdbNzs5WamrqZXVOltfevXvVrVs3paen67vvvrNb+vpCrFarIiMjPfqcPJ+SXidTU1OLTQyKliY26yqBRFIAVJj27dtLktasWeOwbe3atbriiitslxQvVNdisaht27aSpJo1ayoqKkpr164ttq4ktWvXzjlPwg2UpR+LbNq0yXYTuPj4eNWtW7dMx/zzzz+Vn59f4sTkS1V5+rI4RcOGzu6f9u3b69ChQzpw4IBd3QMHDig5Odnjz0mpcOWWRYsWKSIiQv379y/TMS/Xc7IsmjdvLj8/vxL7Xfr7tc/Ly0tt2rTR5s2bHT6ArVu3ToZhXFbnZHns3btXXbt21alTp/Tdd9+pdevWZdo/KytLBw8e9Ohz8nxKep0sKCjQunXr7OpmZWVpy5Ytpp+TJAWAE+zfv187duywu3Nr//79FRAQoNmzZys/P99WvnTpUv35559244IbNmxouyNx0WQ6qXBS0uLFi9W9e3fVqFHDVh4XF6fdu3dr6dKltrL8/HzNmjVLlStXVu/evSvqqVaoi+1HSdq8ebN69Oih4OBgxcfHKzo6usTjHTt2zKGsoKBAjz32mCTZLfl6qbnYvszIyLBdzj7b5s2btXjxYjVp0kQNGjSwlcfFxUmSZs6caVe/6PGlOg7eGedkkS+//FJHjx7VqFGjZLVai63jaedkWQQHB6tv37768ccflZCQYCtPT0/X/Pnz1ahRI7tVXeLi4nTmzBm9+eabdu3MnDlTPj4+bnfTrdK62H6UpH379qlbt246efKkVqxYYfvSqTjFnZOS9PjjjysvL8+jz8m8vLxiV2A6cOCA3njjDYWHh6tTp0628mHDhslisTi8Ts6bN09nzpwx/XWSOxoDJVi0aJH27dsnSZo1a5ZycnL0wAMPSJLq1q2rUaNG2ep27dpVq1at0p49e+xuqf7SSy9p8uTJ6tq1q+Li4nTo0CG99NJLql27ttavX2/3beLq1avVrVs31apVSxMmTLAd96+//tIvv/yili1b2uoeO3ZMbdu21bFjxzRp0iRFRUXpww8/1I8//qj58+dr3LhxFdk1ZeLKfty3b5/atm2r48eP68knn7T70Fpk4MCBtrvNDho0SGlpaerUqZNq166t1NRUffbZZ9q4caP69++v//73v+beXfIcruzLLVu2qFevXhowYIAaNWpkW33o7bfflpeXl1asWKFrrrnGLr6+ffvqq6++0rhx42x3NH7rrbc0cuTIYu+KbBZX/20X6dWrl7755htt27bN4S6nRTzxnFy6dKntQ/57772npKQkTZs2TVLhyi5Fd3iXCu/p0qFDB1mtVk2cOFGVKlXSvHnz9Ntvv+nrr79Wz549bXVzcnLUqVMnJSQk6N5771WTJk20bNkyLVmyRI899pjtGO7Alf14+vRptWzZUnv27NGECRMclseUpB49eti+4Z44caLWrl2rbt26qU6dOkpPT9eyZcsUHx+vK6+8UvHx8QoICHB+p5STK/vy5MmTio6O1oABA9SkSRPb6kPz589Xenq6PvzwQw0ZMsQuvgkTJmj27NkaOHCgevfure3bt+vVV1/V1VdfrR9++IE7GgPuqEuXLoakYn+6dOlSbN3i7mi4YMECo0WLFoafn58RERFh3HbbbcZff/1V7DFXr15tdO/e3QgKCjKCg4ONG264wdi4cWOxdQ8ePGiMHDnSCA8PN/z8/IzWrVsbH3300cU+badzZT/Gx8eXeKyin7Pbnj9/vtGlSxejevXqhtVqNYKDg40rr7zSeO211xzu6OkOXNmXKSkpxsiRI40rrrjCCAkJMXx8fIzatWsbt956q7F9+/Zi48vMzDSmTJli1K1b1/D19TWio6ONf//730ZOTo6zusApzPjb3r9/v+Hl5WV06tTpvLF54jlZdOfs4n6Kuxvttm3bjH79+hmhoaFGQECAcfXVVxvfffddsfGdOHHCuPvuu42aNWsavr6+RpMmTYxZs2bZ3fnYHbiyH4vumn2+n/j4eFv9zz//3LjhhhuMyMhIw8/PzwgMDDRatmxpPPPMM0ZmZmbFdUo5ubIvs7KyjHHjxhmxsbFG5cqVDR8fH6NGjRrG4MGDjV9//bXY+PLy8owXX3zRaNy4seHr62tERkYaEydONE6fPu3knig7rhQAAAAAHs59rkECAAAAMAVJAQAAAODhSAoAAAAAD0dSAAAAAHg4kgIAAADAw5EUAAAAAB6OpAAAAADwcCQFAAAAgIcjKQDKacyYMbJYLLJYLIqNjXXYXlBQoKeffloNGjSQ1WpVgwYNJEkvvPCCYmJiVFBQUK7jzpkzR3Xq1FF2drbDtpkzZ9pislgsSk1NLdcxyiM3N1cbNmzQsmXLtHDhQr355ptKSkpy2fEBAED5kRQAxfj222/tPlyf+/Puu+9KkqpWrapFixbpueeec2jj9ddf1xNPPKFBgwbp7bff1ty5c5WWlqbnn39e//rXv+TlZf/nN3XqVHl5eWn79u0ObY0dO1be3t76+uuvNWbMGOXk5Gju3LkO9W688UYtWrRIAwcOdFJPlF5WVpY2bdqkkydPKiwszOXHBwAA5edjdgCAO0pISJAkvfrqq6pSpYrD9p49e+qHH35QUFCQRo4cWWwbCxYsUI8ePTR9+nRb2cyZM5WXl6e4uDiH+nfddZeee+45zZw50+4D/6xZs7RgwQI9/fTT6tOnjyRp9OjRmjFjhiZMmCCLxWKrGxMTo5iYGP3xxx9asmRJ+Z58OQUGBmrkyJEKDAzU0aNHXX58AABQfiQFQDESExMVGhqqe+65x+5Dd2llZWUpISFBU6dOtStfsGCB+vXrJ39/f4d9qlWrphEjRmjRokV65plnVLVqVa1atUqTJk3S4MGDNWXKFFvdoUOH6oUXXlB8fLy6d+9e9idYAby9vRUYGGh2GAAAoBwYPgQUIyEhQa1bty5XQjBu3DgFBAQoPz9fjz32mCwWizp27Kg9e/YoMTFR119/fYn7Tpw4UZmZmZozZ44OHDigoUOHKiYmRu+8845dvbZt2yosLExffPFFmeMrTkFBgbKyskr1YxiGU44JAADcB1cKgHPk5OQoKSlJ11xzTbETdUNDQ2W1Wkvcf8SIEbJarZo7d65eeeUVhYWFqW7dulq9erUkqU2bNiXu26xZM91www167bXX9Pnnnys3N1eff/65goODHeq2adNGv/zySzmeoaPDhw/rq6++KlXduLg4hYSEOOW4AADAPZAUAOfYtm2bcnNzNWfOHM2ZM8dhe1JSkho3blzi/t27d9f333+voKAg3XPPPbYJxY8//rgkKTo6+rzHnzRpkm688UYdOXJEy5Yts61adK769etr0aJFpX1a5xUeHq7evXuXqm5AQIBTjgkAANwHSQFwjsTEREnSO++8o6ioKIftjRo1KlUbzZo1s1th6NixY/Lx8Sn2W/+zFa0+VL9+ffXs2bPEelWqVFFmZqbOnDlz0WP5/fz8VKtWrYtqAwAAXLpICoBzJCQkyMfHR3FxcfL19S13G+f7QF+SlStXavLkyWrUqJF27dqlFStW6IYbbii2btHY/vLMezhXfn5+sfc9KI6/v7/DcqoAAODSRlIAnCMxMVHR0dHlTghOnjypAwcOqHnz5nbl4eHhysvL0+nTp4sdk//nn39q2LBhat26tVauXKnGjRvr5ZdfLjEpOHHihAIDA50ynOevv/5iTgEAAB6MpAA4R2Jioq666qqL2l+SWrRoYVceExMjSdqzZ4/DtvT0dPXv319Wq1VLlixRaGio/vnPf2rq1Knavn27mjRp4nCcPXv2FFteHswpAADAs5EUAGc5fPiwjhw5YvsAXx5FNz4794N/x44dJUkbNmyw22YYhkaNGqWkpCTFx8fbxvb/85//LPZmZkU2bdqkESNGlDvOszlrTsHWrVuVk5OjM2fOSJL27dunjIwMSVJsbGy5r74AAICKRVIAnKXoA/3Ro0f13nvvOWxv2bKlw7CgcyUmJioqKkphYWF25fXr11dsbKxWrlypsWPH2sqfeuopff7555o7d66uvvpqW3lERIRGjhypRYsW6dlnn1V4eLht28aNG3X8+HH179+/XM+zoiQmJio9Pd32eO/evdq7d6+kwgnaJAUAALgnkgLgLEVDfxYsWKAFCxY4bH/33XdLlRSce5WgyNixY/XEE08oMzNTAQEBWrJkiaZNm6Y777xT48ePd6g/ceJEvfXWW5ozZ47dHY0XL16sOnXquM3djIsMHz7c7BAAAEA5WAxuTwqUy5gxY/TDDz9o06ZN8vHxUeXKlS+4z6lTp1S/fn298MILGjduXLmOm52drXr16unhhx/WfffdZ7ctKytL6enpeuGFFzR9+nQdPXpUVatWLddxAACA52BdQeAiHDhwQBEREbrmmmtKVT80NFQPPfSQpk+froKCgnIdc8GCBbJarbrzzjsdts2ZM0cRERGaPn16udoGAACeiSsFQDlt27ZNycnJkqTg4OCLWrHIWQ4cOKCkpCTb4y5dushqtZoYEQAAuBSQFAAAAAAejuFDAAAAgIcjKQAAAAA8HEkBAAAA4OFICgAAAAAPR1IAAAAAeDiSAgAAAMDDkRQAAAAAHo6kAAAAAPBwJAUAAACAh/t/M6S6c1SfN4cAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x250 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# waterfall plot for the young boy (background distribution => survival)\n",
    "shap.plots.waterfall(explanation[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Using young women for the background distribution\n",
    "\n",
    "If we compare the sample to young women, then neither of the features matter except for adult men (`data=(0, 0)`), in which both features are given equal credit for their death (as one might intuitively expect)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature data:\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[1, 0],\n",
       "       [1, 1],\n",
       "       [0, 0]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "SHAP values:\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[ 0. , -0. ],\n",
       "       [ 0. ,  0. ],\n",
       "       [-0.5, -0.5]])"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "explainer = shap.TreeExplainer(\n",
    "    model,\n",
    "    np.ones((1, M)),  # background distribution => all young women\n",
    "    feature_perturbation=\"interventional\",\n",
    ")\n",
    "explanation = explainer(X.head(3))\n",
    "\n",
    "print(\"Feature data:\")\n",
    "display(explanation.data)\n",
    "print()\n",
    "print(\"SHAP values:\")\n",
    "display(explanation.values.round(4))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "shap",
   "language": "python",
   "name": "shap"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
